#pragma once
#include <array>
#include <string>
#include <vector>

namespace cem
{

// 边界条件类型（脚手架阶段）。
enum class BoundaryType
{
    Dirichlet,
    Neumann,
    Robin,
    Impedance
};

// 复数边界值/背景模式类型。
// 说明:
// - RealValue: 仅使用 value 实数幅值（向后兼容）。
// - ComplexValue: 使用 value_real + i*value_imag 作为复数幅值。
// - Layered1DElectric: 使用复数幅值作为切向电场 E_t，若未提供复数则回退到 value。
// - Layered1DMagnetic: 使用复数幅值作为切向磁场 H_t，并通过背景表面阻抗换算为 E_t 注入。
enum class BoundaryComplexMode
{
    RealValue,
    ComplexValue,
    Layered1DElectric,
    Layered1DMagnetic
};

// 单个边界条件规格说明。
struct BoundarySpec
{
    int boundary_id{0};
    BoundaryType type{BoundaryType::Dirichlet};
    double value{0.0};

    // 可选: 指定边界量的方向（例如切向 Dirichlet/Neumann 的参考方向）。
    // 说明: 若 has_direction 为 true，则使用 direction 的切向投影作为方向；
    //       否则在装配时将根据法向量构造一个稳定的单位切向量。
    std::array<double, 3> direction{{1.0, 0.0, 0.0}};
    bool has_direction{false};

    // 复数幅值（可选）。当 mode 为 ComplexValue 或 Layered1D* 时生效。
    double value_real{0.0};
    double value_imag{0.0};

    // 复数/背景模式。
    BoundaryComplexMode mode{BoundaryComplexMode::RealValue};
};

// BoundaryConditionManager 统一管理边界条件集合（占位实现）。
class BoundaryConditionManager
{
public:
    // 函数: add_spec
    // 作用: 添加一条边界条件说明。
    // 参数: spec - 边界说明
    // 返回: 无
    void add_spec(const BoundarySpec & spec);

    // 函数: specs
    // 作用: 访问所有边界条件说明。
    // 参数: 无
    // 返回: 常量引用
    const std::vector<BoundarySpec> & specs() const;

private:
    std::vector<BoundarySpec> _specs; // 边界条件集合
};

} // namespace cem